In a flash memory system, to achieve high endurance the system typically employs a wear levelling algorithm that keeps all of the physical blocks within a tight range of cumulative program/erase (P/E) cycles. The assumption being that the physical blocks all have the same endurance (when disregarding the weak blocks that are compensated for by over-provisioning) and therefore will all wear out at substantially the same time. However, in practice the physical blocks do not all have the same endurance. Thus, the flash memory system may reach its specified end of life while many of the physical blocks are still be usable.